// 导出login
const express = require('express')
const axios = require('axios')
const fs = require('fs')
const { promisify } = require('util')
const authMiddleware = require('../middleware/authmiddleware')
// 生成结果时的最大单词数
let max_tokens = 1500
// 采样温度，介于0和2之间, 控制结果的随机性。 较高的值（如0.8）将使输出更随机，而较低的值（如0.2）将使其更集中和确定性。
let temperature = 0.5
const { apiToken, model, stream, ChatGptUrl } = require('../constant')
// 创建路由容器
const chat = express.Router()
// 挂载路由
// 经过authMiddleware中间件同意后才可以进行访问该接口
chat.post('/chat', authMiddleware, (req, res) => {
    axios({
        method: 'post',
        url: ChatGptUrl,
        headers: {
            'Content-Type': 'application/json',
            Authorization: `Bearer ${apiToken}`,
        },
        data: {
            messages: [{ role: 'user', content: req.body.question }],
            model: 'gpt-3.5-turbo-0301',
            temperature: 0.5,
            // presence_penalty: 0,
        },
    })
        .then(response => {
            return res.json(response.data)
        })
        .catch(error => {
            console.error(error)
        })
    // try {
    //     // 向chat发送请求
    //     const response = await axios.post(
    //         ChatGptUrl,
    //         {
    //             max_tokens,
    //             temperature,
    //             stream,
    //             model,
    //             messages: [
    //                 {
    //                     role: 'user',
    //                     content: req.body.question,
    //                 },
    //             ],
    //         },
    //         {
    //             headers: {
    //                 Authorization: `Bearer ${apiToken}`,
    //                 'Content-Type': 'application/json',
    //             },
    //             responseType: 'stream',
    //         }
    //     )
    //     // 之后将请求到的数据写入用户暂时文件，文件名为用户名
    //     const tempFile = `./temp/${req.body.username}.txt`
    //     // 创建临时文件
    //     fs.writeFile(tempFile, '', err => {})
    //     // 创建了一个可写流对象 writeStream，并将其连接到刚创建的临时文件上
    //     const writeStream = fs.createWriteStream(tempFile)
    //     // 将 HTTP 响应中的数据流导向该可写流对象，将数据写入到临时文件中。
    //     response.data.pipe(writeStream)
    //     // 为了确保数据已经全部写入到文件中，等待 writeStream 对象触发 'finish' 或 'error' 事件。一旦这些事件被触发，就意味着文件已经成功写入或者出现错误，相应的 promise 状态也会被解析或拒绝。
    //     await new Promise((resolve, reject) => {
    //         writeStream.on('finish', resolve)
    //         writeStream.on('error', reject)
    //     })
    //     // 设置了 HTTP 响应头的 Content-Type，并使用 fs.createReadStream() 方法创建了一个可读流对象 readStream，并将其连接到刚才所创建的临时文件上。
    //     res.setHeader('Content-Type', 'text/plain')
    //     const readStream = fs.createReadStream(tempFile)
    //     // 将该可读流对象的数据导向 HTTP 响应对象的可写流中，将文件内容发送给客户端。
    //     readStream.pipe(res)
    //     // 为了确保 readStream 对象已经完全读取文件内容，待 readStream 对象触发 'close' 事件。一旦该事件被触发，就意味着可读流对象已经关闭，相应的 promise 状态也会被解析。
    //     // promisify()方法将可读流的close事件转换为Promise，并等待Promise解决或拒绝。
    //     await promisify(readStream.on).call(readStream, 'close')
    // } catch (error) {
    //     return res.status(500).send(error.message)
    // }
})
module.exports = chat
